#pragma once
#include <iostream>
#include <string>
#include <vector>
#include <sstream>

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include "Util.hpp"
using namespace std;

const string sep = "\r\n";
const string default_root = "./wwwroot"; // 默认web根目录路径，下面带了/，所以这里就不用带了
////----如果url就是一个/，那么我们下面拼接之后，路径就是./wwwroot/，那我们具体要什么资源呢？
////----直接使用home_page默认首页，如果访问的是/直接访问首页
const string home_page = "index.html"; // 默认首页
const string html_404 = "wwwroot/404.html";
class HttpRequest
{
public:
    HttpRequest() {}
    ~HttpRequest() {}
    void parse() // 解析方法
    {
        // 1、从inbuffer中拿到第一行，分隔符\r\n
        string line = Util::getOneLine(inbuffer, sep);
        if (line.empty())
            return;
        // 2、从请求行中提取出3个字段
        // cout << "line:" << line << endl;
        stringstream ss(line); // 这是一个流的方式，以空格为分隔符，自动分割
        ss >> method >> url >> httpversion;

        // 2.1 /a/b/s?name=zhangsan&pwd=12345
        // 通过?将左右进行分离
        // 如果是PoST方法，本来就是分离的!
        // 左边PATH，右边parm

        // 3、添加web根目录默认路径
        path = default_root; // ./wwwroot
        // url我们前面写的都是/，所以加上之后，上面默认就不用带/了
        path += url;                      // ./wwwroot /a/b/c.html...
        if (path[path.size() - 1] == '/') // 只要访问的是/，不明确具体资源，直接拼接，跳转到首页
            path += home_page;

        // 4、获取path对应的资源后缀
        // ./wwwroot/index.html
        // ./wwworrt/a/b/1.jpg
        auto pos = path.rfind(".");
        if (pos == string::npos)
            suffix = ".html";
        else
            suffix = path.substr(pos);

        // 5、得到资源的大小
        struct stat st;
        int n = stat(path.c_str(), &st);
        if (n)
            size = st.st_size;
        else
            size = -1;
    }

public:
    string inbuffer;
    string reqline;
    vector<string> reqheader;
    string body;

    // 第一行数据
    string method;      // GET
    string url;         // 目录
    string httpversion; // http版本

    string path;   // web更目录路径
    string suffix; // 资源后缀
    int size;      // 正文长度
    string parm;   // 具体的提交数据
};

class HttpResponse
{
public:
    string outbuffer;
};
